<?php

namespace App\Http\Controllers\OperationManagement;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\OperationManagement\SanitationTask;
use App\Models\OperationManagement\SanitationTaskFile;
use Illuminate\Database\QueryException;
use App\Http\Requests\OperationManagement\SanitationTaskRequest;
use Illuminate\Support\Facades\DB;

/**
 * @group 基础信息管理->环卫->任务管理
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */

class SanitationTaskController extends Controller
{
    /**
     * 任务管理查看列表
     *
     * @queryParam task_name string 任务名称
     * @queryParam task_category_id int 任务类型 外键 任务类型表
     * @queryParam task_content string 任务内容
     * @queryParam task_address string 任务地址
     * @queryParam task_areas polygon 任务区域 (0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)
     * @queryParam department_id int 任务部门id 外键 部门表
     * @queryParam post_ids string 岗位id字符串 如1,2
     * @queryParam task_principal_id int 任务负责人id 外键 员工表
     * @queryParam task_publisher_id int 任务发布人id 外键 员工表
     * @queryParam car_id int 任务车辆id 外键 车辆信息表
     * @queryParam task_begin_time datetime 任务开始时间
     * @queryParam task_end_time datetime 任务结束时间
     * @queryParam task_level int 紧急程度  1-一级 2-二级 3-三级
     * @queryParam task_source string 任务来源
     * @queryParam task_status string 任务状态 0=待完成 1=待反馈 2=已经反馈 3=已完成
     * @queryParam step string 处理措施
     * @queryParam task_tool string 工具
     * @queryParam staff string 出勤人员 如:1,2,3
     * @queryParam remark string 备注
     * @queryParam files->file->local_url string 附件url地址
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $sanitationTask = new SanitationTask;
        $data = $sanitationTask->getList($request);
        return response()->json(encodeMsg($data,200));
    }

    /**
     * 添加任务
     *
     * @bodyParam task_name string required 任务名称
     * @bodyParam task_category_id int 任务类型 外键 任务类型表
     * @bodyParam task_content string required 任务内容
     * @bodyParam task_address string 任务地址
     * @bodyParam task_areas polygon 任务区域 (0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)
     * @bodyParam department_id int required 任务部门id 外键 部门表
     * @bodyParam post_ids string 岗位id字符串 如1,2
     * @bodyParam task_principal_id int 任务负责人id 外键 员工表
     * @bodyParam task_publisher_id int 任务发布人id 外键 员工表
     * @bodyParam car_id int 任务车辆id 外键 车辆信息表
     * @bodyParam task_begin_time datetime required 任务开始时间
     * @bodyParam task_end_time datetime required 任务结束时间
     * @bodyParam task_level int required 紧急程度  1-一级 2-二级 3-三级
     * @bodyParam task_source string required 任务来源
     * @bodyParam task_principal_id int required 任务负责人id 外键 员工表
     * @bodyParam task_status string required 任务状态 0=待完成 1=待反馈 2=已经反馈 3=已完成
     * @bodyParam step string 处理措施
     * @bodyParam task_tool string 工具
     * @bodyParam staff string 出勤人员 如:1,2,3
     * @bodyParam remark string 备注
     * @bodyParam park_task_ids string 任务附件ids:1,2,3
     *
     * @queryParam task_name string 任务名称
     * @queryParam task_category_id int 任务类型 外键 任务类型表
     * @queryParam task_content string 任务内容
     * @queryParam task_address string 任务地址
     * @queryParam task_areas polygon 任务区域 (0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)
     * @queryParam department_id int 任务部门id 外键 部门表
     * @queryParam post_ids string 岗位id字符串 如1,2
     * @queryParam task_principal_id int 任务负责人id 外键 员工表
     * @queryParam task_publisher_id int 任务发布人id 外键 员工表
     * @queryParam car_id int 任务车辆id 外键 车辆信息表
     * @queryParam task_begin_time datetime 任务开始时间
     * @queryParam task_end_time datetime 任务结束时间
     * @queryParam task_level int 紧急程度  1-一级 2-二级 3-三级
     * @queryParam task_source string 任务来源
     * @queryParam task_status string 任务状态 0=待完成 1=待反馈 2=已经反馈 3=已完成
     * @queryParam step string 处理措施
     * @queryParam task_tool string 工具
     * @queryParam staff string 出勤人员 如:1,2,3
     * @queryParam remark string 备注
     * @queryParam park_task_ids string 任务附件ids:1,2,3
     *
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        DB::beginTransaction();
        try {
            $data = SanitationTask::create($request->all());
            if($request->has('sanitation_task_ids')){
                $file_data = [];
                $fileArr = explode(',',$request->get('sanitation_task_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['sanitation_task_id'] = $data->id;
                    array_push($file_data,$tmp);
                }
                try{
                    SanitationTaskFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复".$e->getMessage()],404), 404);
                }
            }
            DB::commit();
            return response()->json(encodeMsg($data,201));
        } catch (QueryException $e) {
            DB::rollBack();
            // dd($e);
            return response()->json(encodeMsg(['message' => '任务添加失败!'],400));
        }
    }

    /**
     * 查看任务
     *
     * @bodyParam id int required 任务ID
     *
     * @queryParam task_name string 任务名称
     * @queryParam task_category_id int 任务类型 外键 任务类型表
     * @queryParam task_content string 任务内容
     * @queryParam task_address string 任务地址
     * @queryParam task_areas polygon 任务区域 (0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)
     * @queryParam department_id int 任务部门id 外键 部门表
     * @queryParam post_ids string 岗位id字符串 如1,2
     * @queryParam task_principal_id int 任务负责人id 外键 员工表
     * @queryParam task_publisher_id int 任务发布人id 外键 员工表
     * @queryParam car_id int 任务车辆id 外键 车辆信息表
     * @queryParam task_begin_time datetime 任务开始时间
     * @queryParam task_end_time datetime 任务结束时间
     * @queryParam task_level int 紧急程度  1-一级 2-二级 3-三级
     * @queryParam task_source string 任务来源
     * @queryParam task_status string 任务状态 0=待完成 1=待反馈 2=已经反馈 3=已完成
     * @queryParam step string 处理措施
     * @queryParam task_tool string 工具
     * @queryParam staff string 出勤人员 如:1,2,3
     * @queryParam remark string 备注
     * @queryParam files->file->local_url string 附件url地址
     *
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $data = SanitationTask::with('files')->find($id);
        if($data == []) {
            return response()->json(encodeMsg(["message" => "没有该任务信息!"], 404));
        } else {
            return response()->json(encodeMsg($data,200));
        }
    }

    /**
     * 修改任务
     *
     * @bodyParam task_name string required 任务名称
     * @bodyParam task_category_id int 任务类型 外键 任务类型表
     * @bodyParam task_content string required 任务内容
     * @bodyParam task_address string 任务地址
     * @bodyParam task_areas polygon 任务区域 (0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)
     * @bodyParam department_id int required 任务部门id 外键 部门表
     * @bodyParam post_ids string 岗位id字符串 如1,2
     * @bodyParam task_principal_id int 任务负责人id 外键 员工表
     * @bodyParam task_publisher_id int 任务发布人id 外键 员工表
     * @bodyParam car_id int 任务车辆id 外键 车辆信息表
     * @bodyParam task_begin_time datetime required 任务开始时间
     * @bodyParam task_end_time datetime required 任务结束时间
     * @bodyParam task_level int required 紧急程度  1-一级 2-二级 3-三级
     * @bodyParam task_source string required 任务来源
     * @bodyParam task_principal_id int required 任务负责人id 外键 员工表
     * @bodyParam task_status string required 任务状态 0=待完成 1=待反馈 2=已经反馈 3=已完成
     * @bodyParam step string 处理措施
     * @bodyParam task_tool string 工具
     * @bodyParam staff string 出勤人员 如:1,2,3
     * @bodyParam remark string 备注
     * @bodyParam park_task_ids string 任务附件ids:1,2,3
     *
     * @queryParam task_name string 任务名称
     * @queryParam task_category_id int 任务类型 外键 任务类型表
     * @queryParam task_content string 任务内容
     * @queryParam task_address string 任务地址
     * @queryParam task_areas polygon 任务区域 (0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)
     * @queryParam department_id int 任务部门id 外键 部门表
     * @queryParam post_ids string 岗位id字符串 如1,2
     * @queryParam task_principal_id int 任务负责人id 外键 员工表
     * @queryParam task_publisher_id int 任务发布人id 外键 员工表
     * @queryParam car_id int 任务车辆id 外键 车辆信息表
     * @queryParam task_begin_time datetime 任务开始时间
     * @queryParam task_end_time datetime 任务结束时间
     * @queryParam task_level int 紧急程度  1-一级 2-二级 3-三级
     * @queryParam task_source string 任务来源
     * @queryParam task_status string 任务状态 0=待完成 1=待反馈 2=已经反馈 3=已完成
     * @queryParam step string 处理措施
     * @queryParam task_tool string 工具
     * @queryParam staff string 出勤人员 如:1,2,3
     * @queryParam remark string 备注
     * @queryParam park_task_ids string 任务附件ids:1,2,3
     *
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $sanitationTask = SanitationTask::find($id);
        if($sanitationTask == []) {
            return response()->json(encodeMsg(["message" => "没有该任务信息!"], 404));
        }
        DB::beginTransaction();
        try {
            if($request->has('sanitation_task_ids')){
                $origin_files = SanitationTaskFile::where('sanitation_task_id',$id)->get()->toArray();//图片原来的id号是好多 取出
                $origin_file_ids = array();//这个数组用于报错以前的所有file的id号
                if($origin_files != []){
                    foreach ($origin_files as $v){
                        array_push($origin_file_ids,$v['id']);
                    }
                }
                $file_data = [];
                $fileArr = explode(',',$request->get('sanitation_task_ids'));
                foreach ($fileArr as $k=>$value){
                    $tmp = [];
                    $tmp['file_id'] = $value;
                    $tmp['sanitation_task_id'] = $id;
                    array_push($file_data,$tmp);
                }
                try{
                    SanitationTaskFile::whereIn('id',$origin_file_ids)->delete();
                    SanitationTaskFile::insert($file_data);
                }catch (\Exception $e){
                    DB::rollBack();
                    dd($e);
                    return response()->json(encodeMsg(["message" => "请先确认图片是否已经添加或者图片id是否重复".$e->getMessage()],404), 404);
                }
            }
            $sanitationTask->update($request->all());
            DB::commit();
            return response()->json(encodeMsg($sanitationTask,200));
        } catch (QueryException $e) {
            DB::rollBack();
            return response()->json(encodeMsg(['message' => '任务修改失败!'],400));
        }
    }

    /**
     * 删除任务
     *
     * @bodyParam id int required 任务ID
     * @response 204 {
     *   "message": "任务删除成功"
     * }
     *
     *
     * @response 404 {
     *  "message": "没有该任务信息"
     * }
     *
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $sanitationTask = SanitationTask::find($id);
        if($sanitationTask == []) {
            return response()->json(encodeMsg(["message" => "没有该任务信息!"], 404));
        }
        if($sanitationTask->delete()) {
            return response()->json(encodeMsg(["message" => "方案删除成功!"], 204));
        } else {
            return response()->json(encodeMsg(["message" => "任务删除失败!"], 400));
        }
    }

    /**
     * 任务批量删除
     *
     * @bodyParam ids int required id集合字符串[格式：ids=1,2,3]
     * @response 204 {
     *   "message": "任务删除成功"
     * }
     *
     *
     */
    public function delete($ids)
    {
        $listId = explode(',', $ids);
        SanitationTask::whereIn('id',$listId)->delete();
        return response()->json(encodeMsg(["message" => "任务删除成功!"], 204));
    }
}
